package com.algo.generator.sequnse;

import org.springframework.stereotype.Component;

/**
 * 基于雪花算法实现唯一id生成
 * 核心思想：
 *      使用一个64bit的long类型的数字作为全局唯一id，共分为四个部分：
 *          第一部分：1bit  符号位
 *          第二部分：41bit 毫秒数，最多可生成 (2^41-1)个数字，换算成年是 69年的时间
 *          第三部分：10bit 工作机器的id，最多可部署 2^10台机器，也就是1024台机器，如果是多机房，可以灵活设置几位代表的是机房的 id
 *          第四部分：12bit 序列号，这个是设置同一毫秒产生不同的id，最多是 (2^12，从 0~4095) 个
 *
 *      格式如下所示：
 *      0|1000000 00001000 01001000 01000000 00100100 01|000000 0001|0000 00000001
 *    符号位                  毫秒数                        工作机器的ID    序列号
 *
 *  优点：
 *      （1）高性能，纯内容操作，不依赖数据库
 *      （2）可以同时部署多台服务集群，实现服务的高可用
 *      （3）生成的ID单调递增
 *
 *  缺点：
 *      生产上具体使用时，需要解决时钟回拨的问题
 *
 */
@Component("snowFlakeSequnceCreator")
public class SnowFlakeSequnceCreator implements SequnseCreator {

    /**
     * 雪花算法是不依赖于业务桩的
     * @param stub 业务桩
     * @return
     */
    @Override
    public Long create(String stub) {
        System.currentTimeMillis();



        return null;
    }

    public static void main(String[] args) {
        // 有符号左移
        System.out.println("-1 << 5  结果为：" + (-1 << 5));

        System.out.println(1 << 5);
        System.out.println(-1 ^ (-1 << 5));
    }

}
